#!/bin/bash

set -e # 表示脚本发生了错误就退出

# 使用apt执行安装任务, -y命令表示一直同意往下执行
apt install -y cmake libunwind-dev zip libfl-dev bison ninja-build autoconf-archive libtool
apt install -y curl libxml2-dev
# 输出g++的版本号
g++ --version

BVER=1.76.0 # 设置Boost依赖的版本号

# ${}表示bash中的插值语法, //表示对变量替换, 类似于管道符号
BOOST=boost_${BVER//./_}   # replace all . with _

# For sake of boost install we always use g++.
# 使用g++安装boost依赖, export定义环境变量, 但仅在当次登录有效
export CXX=g++

# 安装boost的函数
install_boost() {
    # 创建文件夹并且将栈目录压到栈顶, 并移动到当前目录
    mkdir -p /tmp/boost && pushd /tmp/boost
    # shell中[]内填判断条件 -d表示内容存在并且是一个目录
    # if的结构为: if condition; then statement; elif condition; then statement; else statement; fi
    if ! [ -d $BOOST ]; then
      url="https://boostorg.jfrog.io/artifactory/main/release/${BVER}/source/$BOOST.tar.bz2" # 设置需要安装的URL地址
      echo "Downloading from $url"
      # 判断文件是否存在, 使用wget获取文件
      if ! [ -e $BOOST.tar.bz2 ]; then wget -nv ${url} -O $BOOST.tar.bz2; fi
      # 解压文件, chown改变文件所有者
      tar -xjf $BOOST.tar.bz2 && chown ${SUDO_USER}:${SUDO_USER} -R $BOOST.tar.bz2 $BOOST
    fi
    # boost的参数
    booststap_arg="--prefix=/opt/${BOOST} --without-libraries=graph_parallel,graph,wave,test,mpi,python"
    # 移动到解压的BOOST目录
    cd $BOOST

    # 获取文件的真实目录
    boostrap_cmd=`readlink -f bootstrap.sh`

    # 显示cpp的编译器
    echo "CXX compiler ${CXX}"
    # 运行的命令和脚本
    echo "Running ${boostrap_cmd} ${booststap_arg}"
    ${boostrap_cmd} ${booststap_arg} || { cat bootstrap.log; return 1; }
    b2_args=(define=BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 link=static variant=release debug-symbols=on
             threading=multi --without-test --without-math --without-log --without-locale --without-wave
             --without-regex --without-python -j4)

    echo "Building targets with ${b2_args[@]}"
    ./b2 "${b2_args[@]}" cxxflags='-std=c++14 -Wno-deprecated-declarations'
    ./b2 install "${b2_args[@]}" -d0
    chown ${SUDO_USER}:${SUDO_USER} -R ./
    # 回到当前目录
    popd
}

# 如果没有安装库, 进行安装
if ! [ -d /opt/${BOOST}/lib ]; then
  install_boost
else
  echo "Skipping installing ${BOOST}"
fi

# 在当前目录建立软连接, 如果没有建立软连接, 建立; 软连接的本质可以理解成文件或者目录的别名: source -> link 
if ! [ -d /opt/boost ]; then
  ln -sf /opt/${BOOST} /opt/boost
fi
